/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package blogic;

import bentity.beLineaTrazabilidad;
import bentity.beLote;
import bentity.bePallet;
import bentity.beProducto;
import bentity.beUbicacion;
import dao.daoHelper;
import dao.daoPallet;
import java.sql.Date;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;

/**
 *
 * @author cesar
 */
public class blPallet {
    public static final int U_ROTADO = 33;
    public static final int U_OCUPADO = 14;
    public static final int U_BLOQUEADO = 15;
    public static final int U_DISPONIBLE = 16;
    public static final int U_RESERVADO = 37;

     public bePallet getPallet(int idUbicacion) throws Exception{
        return ((new daoPallet()).getPallet(idUbicacion));
    }

    public int getIdProducto(int idPallet) throws SQLException{
        return ((new daoPallet()).getIdProducto(idPallet));
    }

    public int getPalletxProd(int idProducto) throws SQLException{
        return ((new daoPallet()).getPalletxProd(idProducto));
    }

    public beProducto getProducto(int idProducto) throws SQLException{
        return ((new daoPallet()).getProducto(idProducto));
    }

    public ArrayList<String> getTipoPallet() throws SQLException{
          return ((new daoPallet()).getTipoPallet());

    }
    public ArrayList<bePallet> obtenerPallet(int estado) throws SQLException{
          return ((new daoPallet()).obtenerPallet(estado));

    }

    public ArrayList<String> obtenerProdXPallet(ArrayList<bePallet> pallets) throws SQLException{
        return ((new daoPallet()).obtenerProdXPallet(pallets));
    }

    public int dameSiguienteId()throws Exception{
        return (new daoHelper()).getNextId("PALLET", "ID_PALLET");
    }

    public int registrarPallet(bePallet pallet) throws Exception{
        if(pallet==null) return -1;

        int nuevoId=dameSiguienteId();

        pallet.setId_Pallet(nuevoId);

        if((new daoPallet().registrarPallet(pallet))>=0){
            return nuevoId;
        }
        else{
            return -1;
        }

    }

    public int registrarPallet_CargaMasiva(bePallet pallet) throws Exception{
        if(pallet==null) return -1;

        int nuevoId=dameSiguienteId();

        pallet.setId_Pallet(nuevoId);

        if((new daoPallet().registrarPallet_CargaMasiva(pallet))>=0){
            return nuevoId;
        }
        else{
            return -1;
        }

    }

     public ArrayList<bePallet> obtenerPalletUbiXInci(ArrayList<String> descripcion, ArrayList<beUbicacion> ubicaciones) throws SQLException{
         return (new daoPallet().obtenerPalletUbiXInci(descripcion, ubicaciones));
     }

     public ArrayList<bePallet> registrarPalletsPorLote(beLote lote)throws Exception{
        return (new daoPallet().registrarPalletsPorLote(lote));
     }

     public ArrayList<beUbicacion> obtenerUbicacionPorFechaVencimiento(String strFila,String strRack,String strPiso,String strUbi, String strFechaVencimientoDesde, String strFechaVencimientoHasta)throws Exception{
         return (new daoPallet().obtenerUbicacionPorFechaVencimiento(strFila,strRack,strPiso,strUbi,strFechaVencimientoDesde, strFechaVencimientoHasta));
     }

    public void registrarLotes(ArrayList<beLote> arrLotes) throws Exception{
        for(int i=0;i<arrLotes.size();i++)
            this.registrarPalletsPorLote(arrLotes.get(i));
    }

    public ArrayList<bePallet> obtenerPalletUbiXInci(ArrayList<String> descripcion,ArrayList<beUbicacion> ubicaciones,String strFila,String strRack,String strPiso,String strUbi) throws SQLException{
       return (new daoPallet().obtenerPalletUbiXInci(descripcion, ubicaciones, strFila, strRack, strPiso, strUbi));
    }

    public Double[] dameDatosDelTipoPallet(String nombrePallet) throws Exception {
        ArrayList<String> tiposPallet=getTipoPallet();
        
        if(tiposPallet==null) return null;
        
        if(nombrePallet.compareTo(tiposPallet.get(0))==0)
            return (new daoPallet().dameDatosDelTipoPallet("EU"));
        else if(nombrePallet.compareTo(tiposPallet.get(1))==0)
            return (new daoPallet().dameDatosDelTipoPallet("AM"));
        else return null;
    }

    public bePallet obtenerPalletPorId(int idPallet) throws Exception{
        return (new daoPallet()).queryPalletByID(idPallet);
    }

    public ArrayList<beLineaTrazabilidad> obtenerHistorialUbicaciones(int id_Pallet) throws Exception{
        ArrayList<beLineaTrazabilidad> lineas = (new daoPallet()).queryHistorialUbicsByIdPallet(id_Pallet);
        int estUbicPall = -1;

        estUbicPall = (new daoPallet()).getEstadoUbicacionPallet(id_Pallet,lineas.get(0).getUbic().getId_ubicacion());

        beLineaTrazabilidad lIngreso = null;
        if ((estUbicPall == U_ROTADO) || (estUbicPall == U_RESERVADO)){
            lIngreso = new beLineaTrazabilidad();
            lIngreso.setFecha(lineas.get(0).getFecha());
            lIngreso.setUbic(lineas.get(0).getUbic());
            lIngreso.setMotivo("Ingreso de pallet.");
            lineas.add(0, lIngreso);
        }

        String ultMotivo = "";
        for(int i=(lineas.size()-1);i>0;i--){
            if (i == (lineas.size()-1))
                ultMotivo = lineas.get(i).getMotivo();
            lineas.get(i).setMotivo(lineas.get(i-1).getMotivo());
        }
        
        estUbicPall = (new daoPallet()).getEstadoUbicacionPallet(id_Pallet,lineas.get(lineas.size()-1).getUbic().getId_ubicacion());
        
        beLineaTrazabilidad lDespacho = null;
        if ((estUbicPall == U_ROTADO)){
            if (ultMotivo.equals("Vencimiento")){
                lDespacho = new beLineaTrazabilidad();
                lDespacho.setUbic(lineas.get(lineas.size()-1).getUbic());
                lDespacho.setFecha(lineas.get(lineas.size()-1).getFechaSalida());
                lDespacho.setMotivo("Salida por vencimiento.");
                lineas.add(lDespacho);
            }
            else{
                if (ultMotivo.equals("Incidente")){
                    lDespacho = new beLineaTrazabilidad();
                    lDespacho.setUbic(lineas.get(lineas.size()-1).getUbic());
                    lDespacho.setFecha(lineas.get(lineas.size()-1).getFechaSalida());
                    lDespacho.setMotivo("Salida por incidente.");
                    lineas.add(lDespacho);
                }
                else{
                    int idOrdenDespacho = (new daoPallet()).obtenerIdOrdenDespacho(id_Pallet,lineas.get(lineas.size()-1).getUbic().getId_ubicacion());
                    Date fechaDespacho = (new daoPallet()).obtenerFechaDespacho(idOrdenDespacho);
                    if (idOrdenDespacho > 0){
                        lDespacho = new beLineaTrazabilidad();
                        lDespacho.setUbic(lineas.get(lineas.size()-1).getUbic());
                        lDespacho.setFecha(fechaDespacho);
                        lDespacho.setMotivo("Se despachó para la orden nro. "+idOrdenDespacho);
                        lineas.add(lDespacho);
                    }
                }
            }
        }

        if (lineas.size()>1)
            lineas.remove(0);
        return lineas;
    }

    public ArrayList<bePallet> obtenerPalletXOrden(int idOrden) throws SQLException{
        return (new daoPallet().obtenerPalletXOrden(idOrden));
    }
    public ArrayList<bePallet> obtenerPalletXOrden2(int idOrden) throws SQLException{
        return (new daoPallet().obtenerPalletXOrden2(idOrden));
    }

    public int obtenerCajas(int idPallet) throws SQLException{
        return (new daoPallet().obtenerCajas(idPallet));
    }

    public int actualizarStock(ArrayList<bePallet> pallets) throws SQLException{

        return (new daoPallet().actualizarStock(pallets));
    }

  
}
